import complex_query from '@dfeidao/atom-nodejs/db/complex-query';
import operate from '@dfeidao/atom-nodejs/db/operate';
import query_1 from '@dfeidao/atom-nodejs/db/query';
import log from '@dfeidao/atom-nodejs/logger/log';
import call_service from '@dfeidao/atom-nodejs/msg/call-service';
import doc_code from '@dfeidao/atom-nodejs/msg/doc-code';
import { IncomingHttpHeaders } from 'http';
import { spaceid, systemid } from '../atom/config';
interface Message {
	params: {
		teacher_name: string;
		productid: string;
		teacher_no: string;
		student_no: string;
		class_id: string;
		class_name: string;
		organization_type: string;
	};
}
interface D {
	information_template_content: string;
	openid: string;
	phone: string;
	hours_used: number;
	class_hour: number;
	remaining_class_hours: number;
	student_no: string;
	student_name: string;
	parent_number: string;
	parent_name: string;
}
interface IWebResult {
	data: unknown;
	cookie?: {
		[name: string]: string;
	} | null;
	content_type?: string;
	headers?: {
		[key: string]: string;
	};
	attachment?: string;
	redirect?: string;
	status_code?: number;
}

export default async function atom(message: Message, action_id: string, session_id: string, headers: IncomingHttpHeaders): Promise<IWebResult> {
	const query = complex_query(action_id, session_id, systemid);
	const { prepare, exec } = query_1(action_id, session_id, systemid);
	const student_no = message.params.student_no;
	const productid = message.params.productid;
	// 	7.2、如果对比结果一样，根据所签到学生“学生编号”和当前系统日期去查询<签到>表，如果查询到数据则提示 “该学生已签过到”，
	const data = new Date();
	const yqd = await query
		.add_field('check_in', 'student_no', 'student_no')
		.where_eq('check_in', 'student_no', student_no)
		.where_eq('check_in', 'productid', productid)
		.where_gte('check_in', 'arrive_time', data.setHours(0, 0, 0, 0))
		.where_lte('check_in', 'arrive_time', data.setHours(23, 59, 59, 999))
		.exec();
	if (!yqd[0]) {
		return { data: { code: 0, msg: '该学生已签过到' } };
	}
	// 如果没有查询到数据，根据所签到的学生“学生编号”和“是否消息接收人”=“1”为条件查询 < 学生家长 > 表获取 “家长编号”“家长姓名”，
	const parent_information = await query
		.add_field('parent_information', 'phone', 'phone') // 手机号i
		.add_field('parent_information', 'student_no', 'student_no') // 学生编号
		.add_field('parent_information', 'student_name', 'student_name') // 学生姓名
		.add_field('parent_information', 'parent_number', 'parent_number') // 家长编号
		.add_field('parent_information', 'parent_name', 'parent_name') // 家长姓名
		.where_eq('parent_information', 'student_no', student_no)
		.where_eq('parent_information', 'productid', productid)
		// .where_eq('parent_information', 'is_message_receiver', '1')
		.exec() as [{
			phone: string,
			student_no: string,
			student_name: string,
			parent_number: string,
			parent_name: string

		}];
	if (!parent_information[0]) {
		return { data: { code: 0, msg: '该学生没有接收人' } };
	}
	// 将“教师, 编号”“教师姓名”“学生编号”“学生姓名”“家长编号”“家长姓名”“班级编号”保存到 < 签到 > 表和 < 考勤记录 > 表，“签到编号”和“考勤记录”编号根据编码规则自动生成，“到达时间”和“记录时间”为当前系统时间，“签到状态”赋值为“1”

	// ，“剩余课时”根据“学生编号”查询 < 签到表 > 获取“剩余课时”最小数值减2保存，如果最小值小于2，给出提示“该学生剩余课时不足”，如果查询不到数据或者数据为0，根据“学生编号”查询 < 学生 > 表获取“课时时长”的数值赋值给"剩余课时"保存；

	// “已用课时”根据“学生编号”查询 < 签到表 > 获取“已用课时”最大数值加2 保存，如果查询不到数据 ，赋值2保存
	let remaining_class_hours = 0;
	let hours_used = 0;
	if (message.params.organization_type !== '0') {
		prepare('check_in', ['remaining_class_hours', 'hours_used'], { student_no, productid }, 1, 1, [], ['arrive_time']);
		const [data4] = await exec<D>();
		if (data4.length) {
			remaining_class_hours = data4[0].remaining_class_hours;
			hours_used = data4[0].hours_used;
			if (remaining_class_hours < 2 && remaining_class_hours > 0) {
				return {
					data: {
						msg: '该学生剩余课时不足',
						code: 0
					}
				};
			}
		}
		if (remaining_class_hours === 0) {
			prepare('student', ['class_hour'], { student_no, productid }, 1, 1, [], []);
			const [data3] = await exec<D>();
			if (data3.length) {
				remaining_class_hours = data3[0].class_hour;
			} else {
				return {
					data: {
						msg: '没有该学生',
						code: 0
					}
				};
			}
		}
		remaining_class_hours = remaining_class_hours - 2;
	}
	hours_used = hours_used + 2;
	const o = operate(action_id, session_id, systemid);
	const { result: sign_in_number } = await doc_code(action_id, session_id, systemid, 'BM0016033', '', 1);
	const { result: check_attendance_info_num } = await doc_code(action_id, session_id, systemid, 'BM0016024', '', 1);
	const time = new Date().getTime();
	log('公众号推送消息 Service begin path:app-home/s003,action_id2:' + action_id, JSON.stringify(remaining_class_hours), JSON.stringify(hours_used), JSON.stringify(parent_information));
	o.insert('check_in', {
		sign_in_number,  										// 签退编号
		teacher_no: message.params.teacher_no,  			// 教师编号
		teacher_name: message.params.teacher_name,  		// 教师名称
		student_no,  		// 学生编号
		student_name: parent_information[0].student_name,  	// 学生姓名
		parent_number: parent_information[0].parent_number, // 家长编号
		parent_name: parent_information[0].parent_name,  	// 家长姓名
		arrive_time: time,  								// 到达时间
		productid,  				// 产品id
		check_in_status: '1',  								// 签到状态
		remaining_class_hours,	// 剩余课时
		hours_used,	// 已用课时
		elapsed_time: 0	// 已用时间

	});
	// 考勤记录
	o.insert('check_attendance_info', {
		check_attendance_info_num, 							// 考勤记录编号
		student_no, 		// 学生编号
		student_name: parent_information[0].student_name, 	// 学生姓名
		class_id: message.params.class_id, 					// 班级编号
		class_name: message.params.class_name, 				// 班级名称
		teacher_no: message.params.teacher_no,				// 教师编号
		teacher_name: message.params.teacher_name, 			// 教师名称
		supplementary_content: '', 							// 补课内容
		supplementary_time: 0, 								// 补课时间
		status: '4', 										// 状态
		record_time: time, 									// 记录时间
		productid 				// 产品id
	});
	const ores = await o.exec();
	if (ores.code === 1) {
		try {

			// 公众号推送消息
			// 	1）依据返回值中的“学生编号”（同7），“是否消息接收人is_message_receiver”=“1”查<学生家长>，获取对应的“家长编号parent_number”、“家长姓名”、“学生编号”、“学生姓名”
			// （2）依据（1）得到的“家长编号parent_number”查<学生家长parent_information>，获取对应得“手机 phone”。
			// （3）依据（2）得到的“手机 phone”查<pub_user_thirdpart_openid（12库）>表，获取对应的“openid”,
			const q_12 = complex_query(action_id, session_id, '12');
			const pub_user_thirdpart_openid = await q_12
				.add_field('pub_user_thirdpart_openid', 'openid', 'openid')
				.where_eq('pub_user_thirdpart_openid', 'productid', message.params.productid)
				.where_eq('pub_user_thirdpart_openid', 'usercode', parent_information[0].phone)
				.exec() as [{ openid: string }];
			// 获取微信公众号授权token
			const { access_token } = await call_service(action_id, session_id, 'thirdpart.weixinpublicno', {
				serviceflag: "getaccesstoken",      // 固定参数
				spaceid,           // 当前项目的spaceid
				thirdpay_type: "weixin_pubno", // 固定参数（weixin_pubno）
				productid    // 当前登录用户对应的productid（从系统参数params中获取）
			});
			// (5) 5.2、依据"信息模板类型" = "1","信息模板状态"="1" 查询<信息模板>表,得到"信息模板内容"
			// 5.3、依据步骤7.3（1）得到“家长姓名”、“学生姓名”和依据步骤5.2得到"信息模板内容"，在"信息模板内容"中的@后拼接完成的信息模板内容
			const information_template = await query
				.add_field('information_template', 'information_template_content', 'information_template_content')
				.where_eq('information_template', 'information_template_type', '1')
				.where_eq('information_template', 'information_template_status', '1')
				.where_eq('information_template', 'productid', message.params.productid)
				.exec() as [{
					information_template_content: string
				}];
			let d = '您好@,您的孩子@签到成功';
			if (information_template[0]) {
				d = information_template[0].information_template_content;
			}
			d = d.replace('@', parent_information[0].parent_name);
			d = d.replace('@', parent_information[0].student_name);
			// （6）调用接口向微信公众号定向推送消息
			const { code } = await call_service(action_id, session_id, 'thirdpart.weixinpubno.bulkpushmessage', {
				tousers: [`${pub_user_thirdpart_openid[0].openid}`],
				spaceid,
				access_token,
				custombody: {
					msgtype: "text",
					text: {
						content: `${d}>>><a href=http://www.qq.com data-miniprogram-appid=wx76be1f60d92a519e data-miniprogram-path=pages/index/index>点击查看详情</a>`
					}
				}
			});
			log(d, '公众号推送消息 Service end path:app-home/s003,action_id:' + action_id, code);

			if (code === 1) {
				return { data: { code: 1, msg: '签到成功' } };
			} else {
				return { data: { code: 0, msg: '签到失败' } };
			}

		} catch (error) {
			return { data: { code: 1, msg: '签到成功' } };

		}
	} else {
		return { data: { code: 0, msg: '签到失败' } };
	}
}
